package com.tingfeng.controller;

import com.alibaba.fastjson.JSON;
import com.tingfeng.config.request.RequestJson;
import com.tingfeng.config.response.ResultModel;
import com.tingfeng.model.UserSaveReq;
import com.tingfeng.model.UserUpdateReq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController extends BaseController {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 使用 @RequestBody 封装
     */
    @PostMapping("/save")
    public Object save(@RequestBody UserSaveReq req) {
        logger.info("保存用户信息：" + JSON.toJSONString(req));
        return new ResultModel(req);
    }

    /**
     * 使用 @RequestBody 封装，带参数验证
     */
    @PostMapping("/update")
    public Object update(@Valid @RequestBody UserUpdateReq req, BindingResult result) {
        if (result.hasErrors()) {
            return ResultModel.fail(result.getFieldError().getDefaultMessage());
        }

        logger.info("修改用户信息：" + JSON.toJSONString(req));
        return new ResultModel(req);
    }

    /**
     * 使用 @PathVariable 获取路径值
     */
    @GetMapping("/info/{userId}")
    public Object info(@PathVariable String userId) {
        logger.info("查询用户id：" + userId);
        return new ResultModel("查询用户id：" + userId);
    }

    /**
     * 使用 @RequestBody 获取map对象
     */
    @PostMapping("/testMap")
    public Object testMap(@RequestBody Map<String, Object> map) {
        logger.info("获取map对象：" + JSON.toJSONString(map));
        return new ResultModel(map);
    }

    /**
     * 使用 @RequestJson 注解
     */
    @PostMapping("/test1")
    public Object test1(@RequestJson String name) {
        logger.info("姓名：" + name);
        return new ResultModel("姓名：" + name);
    }

    /**
     * 使用 @RequestJson 注解，指定参数名称
     */
    @PostMapping("/test2")
    public Object test2(@RequestJson(value = "name") String name) {
        logger.info("姓名：" + name);
        return new ResultModel("姓名：" + name);
    }

    /**
     * 使用 @RequestJson 注解，两个参数
     */
    @PostMapping("/test3")
    public Object test3(@RequestJson String name, @RequestJson String age) {
        logger.info("姓名：" + name + "，年龄：" + age);
        return new ResultModel("姓名：" + name + "，年龄：" + age);
    }

    /**
     * 使用 @RequestJson 注解，三个参数
     */
    @PostMapping("/test4")
    public Object test4(@RequestJson String name, @RequestJson Integer age, @RequestJson String job) {
        logger.info("姓名：" + name + "，年龄：" + age + "，职业：" + job);
        return new ResultModel("姓名：" + name + "，年龄：" + age + "，职业：" + job);
    }

}
